package model

import (
	"database/sql/driver"
	"fmt"
	"time"
)

// JsonTime 自定义时间类型，用于格式化输出
// 便于统一时间序列化格式
// 示例："2023-06-01 12:00:00"
type JsonTime time.Time

// MarshalJSON 实现 JSON 序列化
func (j JsonTime) MarshalJSON() ([]byte, error) {
	var stamp = fmt.Sprintf("\"%s\"", time.Time(j).Format("2006-01-02 15:04:05"))
	return []byte(stamp), nil
}

// Value 实现 driver.Valuer，写入数据库时调用
func (j JsonTime) Value() (driver.Value, error) {
	return time.Time(j), nil
}

// Scan 实现 sql.Scanner，读取数据库时调用
func (j *JsonTime) Scan(value interface{}) error {
	if value == nil {
		return nil
	}
	t, ok := value.(time.Time)
	if !ok {
		return fmt.Errorf("无法将 %v 转换为时间类型", value)
	}
	*j = JsonTime(t)
	return nil
}

// Model 通用基础模型，包含主键和时间戳
// 可被其他模型嵌入，实现自动时间管理
// ID: 主键
// CreatedAt: 创建时间
// UpdatedAt: 更新时间
// DeletedAt: 删除时间（软删除）
type Model struct {
	ID        uint      `gorm:"primaryKey;comment:'主键ID'" json:"id"`
	CreatedAt JsonTime  `gorm:"type:timestamp;column:created_at;comment:'创建时间'" json:"created_at"`
	UpdatedAt JsonTime  `gorm:"type:timestamp;column:updated_at;comment:'更新时间'" json:"updated_at"`
	DeletedAt *JsonTime `gorm:"type:timestamp;column:deleted_at;index;comment:'删除时间'" json:"deleted_at,omitempty"`
}
